home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.mactech.com 2010
/
ftp.mactech.com.tar
/
ftp.mactech.com
/
machack
/
Hacks97
/
NewsTicker.sit
/
NewsTicker
/
source code
/
WindowStuff
/
jGNELib.c
< prev
next >
Wrap
Text File
|
1997-06-20
|
4KB
|
144 lines
/*------------------------------------------------------------------------------
#
# jGNE Hookup Code Resource Library
#
# jGNELib.c - Library for using the jgne code resource
#
# Copyright © CE Software, Inc., Inc. 1996-97
# All rights reserved.
#
------------------------------------------------------------------------------*/
#include "jGNELib.h"
// Here's all the stuff for talking to our 68k library
#define kGNEHandlerGestaltType 'jGNE'
#define kGNEHandlerResType 'CECD'
#define kGNEHandlerResID 10
typedef pascal void (*GNEHandlerActionProcPtr)(short theAction,
long thejGNEProc,
long refcon);
typedef pascal void (*GNEHandlerInitProcPtr)(void);
#if GENERATINGCFM
enum
{
uppGNEHandlerInitInfo = kPascalStackBased,
uppGNEHandlerInfo = kPascalStackBased
| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(short)))
| STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(long)))
| STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(long)))
};
typedef UniversalProcPtr GNEHandlerInitUPP;
typedef UniversalProcPtr GNEHandlerUPP;
#define NewGNEHandlerInitProc(userRoutine) \
(GNEHandlerInitUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppGNEHandlerInitInfo, (ISAType)kM68kISA)
#define NewGNEHandlerProc(userRoutine) \
(GNEHandlerUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppGNEHandlerInfo, (ISAType)kM68kISA)
#define CallGNEHandlerInitProc(userRoutine) \
CallUniversalProc((UniversalProcPtr)(userRoutine), uppGNEHandlerInitInfo)
#define CallGNEHandlerProc(userRoutine, param1, param2, param3) \
CallUniversalProc((UniversalProcPtr)(userRoutine), uppGNEHandlerInfo, param1, param2, param3)
#else
typedef GNEHandlerInitProcPtr GNEHandlerInitUPP;
typedef GNEHandlerActionProcPtr GNEHandlerUPP;
#define NewGNEHandlerInitProc(userRoutine) ((GNEHandlerInitUPP) (userRoutine))
#define NewGNEHandlerProc(userRoutine) ((GNEHandlerUPP) (userRoutine))
#define CallGNEHandlerInitProc(userRoutine) (*(userRoutine)) ()
#define CallGNEHandlerProc(userRoutine, param1, param2, param3) \
(*(userRoutine)) ((param1), (param2), (param3))
#endif
static GNEHandlerUPP GetGNEHandlerUPP(void)
{
static GNEHandlerUPP GNEHandler = nil;
GNEHandlerActionProcPtr GNEHandlerProc;
OSErr error;
Handle hCodeProc;
GNEHandlerInitUPP GNEHandlerInit;
if (GNEHandler)
return GNEHandler;
// Try to get hot key proc ptr from Gestalt selector.
error = Gestalt(kGNEHandlerGestaltType, (long*)&GNEHandlerProc);
if (error || !GNEHandlerProc)
{
// Load hot key code resource.
hCodeProc = Get1Resource(kGNEHandlerResType, kGNEHandlerResID);
if (!hCodeProc)
return nil;
// Lock it, dereference it, build its UPP, and jump right in.
HLock(hCodeProc);
GNEHandlerInit = NewGNEHandlerInitProc(*hCodeProc);
CallGNEHandlerInitProc(GNEHandlerInit);
// DO NOT UNLOCK, DETACH, OR RELEASE the hCodeProc because the init code has locked it down itself and it must not move!
DisposeRoutineDescriptor(GNEHandlerInit);
// Now we should be able to get the hot key proc ptr from the Gestalt selector.
error = Gestalt(kGNEHandlerGestaltType, (long*)&GNEHandlerProc);
if (error || !GNEHandlerProc)
return nil;
}
// We now know that we have a non-nil hot key proc ptr.
// Generate its routine descriptor and return it.
GNEHandler = NewGNEHandlerProc(GNEHandlerProc);
return GNEHandler;
}
// This refers to our hook routine
typedef pascal Boolean (*jEventProcPtr)(EventRecord* event, long refcon);
#if GENERATINGCFM
enum
{
uppHookCallInfo = kPascalStackBased
| RESULT_SIZE(SIZE_CODE(sizeof(short)))
| STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(long)))
| STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(long)))
};
typedef UniversalProcPtr GNEHookUPP;
#define NewGNEHookProc(userRoutine) \
(GNEHookUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppHookCallInfo, (ISAType)kPowerPCISA)
#else
typedef jEventProcPtr GNEHookUPP;
#define NewGNEHookProc(userRoutine) ((GNEHookUPP) (userRoutine))
#endif
void InitjGNEProcLib(void)
{
GetGNEHandlerUPP();
}
void HookjGNE(long thejGNEProc, long refcon)
{
GNEHandlerUPP jGNEProc;
jGNEProc = GetGNEHandlerUPP();
if (!jGNEProc)
return;
CallGNEHandlerProc(jGNEProc, 1, (long)NewGNEHookProc(thejGNEProc), refcon);
}
void UnHookjGNE(void)
{
GNEHandlerUPP jGNEProc;
jGNEProc = GetGNEHandlerUPP();
if (!jGNEProc)
return;
CallGNEHandlerProc(jGNEProc, 2, 0, 0);
}